
// 装饰器模式 重写七个数组方法

import { ARR_METHODS } from './config';
import observeArr from './observeArr';

var originArrayMethods = Array.prototype,
    arrMethods = Object.create(originArrayMethods); // 创建一个带数组原型方法的对象

// 重写
ARR_METHODS.map(function (m) {
  arrMethods[m] = function () {
    var _this = this,
        _args = [].slice.call(arguments),
        // 执行原来的数组方法(保留原有的操作，新增自己的操作——装饰器模式)
        rt = originArrayMethods[m].apply(this, _args);
    // console.log('数组新方法', _args);
    var newArr; // (新增)操作过后返回的数组，进行操作(添加观察)

    switch (m) {
      case 'push':
      case 'unshift':
        newArr = _args;
        break;
      case 'splice':
        newArr = _args.slice(2); // splice有三个参数，splice(0, 1, '11'),第三个参数类型多变
        break;
      default:
        break;
    }
    // 如果存在就添加观察
    // console.log('新数组的操作数据', newArr);
    newArr && observeArr(newArr);

    return rt;
  }
});

export {
  arrMethods
}
